//用户信息token的管理类
/*
1. 创建Token管理类(TokenManager)
2. 定义私有属性(_token)和常量(_key)
3. 创建一个全局单例对象
  a. 使用 _instance 变量来存储类的唯一实例
  b. 通过私有构造函数 TokenManager._internal() 确保外部不能直接创建实例
  c. factory TokenManager() 工厂方法用于检查 _instance 是否已初始化, 若未初始化则创建实例并赋值，最后返回 _instance!
4. 提供init方法用于从本地获取token
5. 提供saveToken方法用于存储token
6. 提供getToken方法用于同步获取token
7. 提供removeToken方法用于删除token

*/

import 'package:shared_preferences/shared_preferences.dart';

/*
当前的 TokenManager，若只为当前用户服务且全局唯一，
则使用单例是合理的选择；若未来需要支持多账户切换，
可以考虑改为实例模式，并结合依赖注入机制统一管理。
*/
class TokenManager {
  //存取用户信息的key
  final _key = 'enjoy_token';
  //本地的token
  static String? _token;
  //单例对象 通过_instance来创建
  static TokenManager? _instance;
  //私有构造函数(自定义构造函数方法)
  TokenManager._internal();

  //工厂方法 重写默认的构造函数
  factory TokenManager() {
    _instance ??= TokenManager._internal();
    return _instance!;
  }

  //初始化token
  Future<void> init() async {
    //获取三方插件的首选项实例
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    //获取token  如果没有则返回空字符串
    _token = prefs.getString(_key) ?? '';
  }

  //保存token
  Future<void> saveToken(String token) async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.setString(_key, token);
    // 保存本地token
    _token = token;
  }

  //获取token
  String? getToken() {
    return _token;
  }

  //移除token
  Future<void> removeToken() async {
    final SharedPreferences prefs = await SharedPreferences.getInstance();
    await prefs.remove(_key);
    _token = '';
  }
}

//实例模式代码
// class TokenManager {
//   // 存取用户信息的 key（改为实例属性）
//   final String _key = 'enjoy_token';

//   // 本地 token（改为实例属性）
//   String? _token;

//   // 允许外部创建多个实例
//   TokenManager();

//   // 初始化 token
//   Future<void> init() async {
//     final SharedPreferences prefs = await SharedPreferences.getInstance();
//     _token = prefs.getString(_key) ?? '';
//   }

//   // 保存 token
//   Future<void> saveToken(String token) async {
//     final SharedPreferences prefs = await SharedPreferences.getInstance();
//     await prefs.setString(_key, token);
//     _token = token;
//   }

//   // 获取 token
//   String? getToken() {
//     return _token;
//   }

//   // 移除 token
//   Future<void> removeToken() async {
//     final SharedPreferences prefs = await SharedPreferences.getInstance();
//     await prefs.remove(_key);
//     _token = '';
//   }
// }
